給定一個整數陣列 nums,請返回「最長嚴格遞增子序列」的長度。子序列是指從陣列中提取的一部分元素,並且這些元素的相對順序保持不變,但不需要是連續的。
範例 1:
範例 2:
範例 3:
限制條件:
這道題要求找到最長的「嚴格遞增子序列」的長度。解法可以分為兩種常見的方法:
動態規劃法:
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if (nums.empty()) return 0;
int n = nums.size();
vector<int> dp(n, 1); // 初始化每個元素的最長遞增子序列長度為 1
int max_len = 1; // 用來追蹤最長遞增子序列的長度
for (int i = 1; i < n; ++i) {
for (int j = 0; j < i; ++j) {
if (nums[i] > nums[j]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
max_len = max(max_len, dp[i]); // 更新全局最大值
}
return max_len;
}
};
二分查找法(O(n log n) 解法):
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
vector<int> tails; // 用來存放遞增子序列的尾部元素
for (int num : nums) {
auto it = lower_bound(tails.begin(), tails.end(), num);
if (it == tails.end()) {
tails.push_back(num); // 將 num 添加到尾部
} else {
*it = num; // 用 num 替換當前位置
}
}
return tails.size(); // tails 的大小就是最長遞增子序列的長度
}
};
1. 動態規劃法:
2. 二分查找法:
1. 動態規劃法:
2. 二分查找法
這題可以通過兩種方法來解決,動態規劃法雖然時間複雜度較高,但思路清晰;而二分查找法則優化了時間複雜度,適合處理更大的數據集。通過這兩種方法,可以靈活應對不同場景下的最長遞增子序列問題。
以上是第二十八天的自學內容分享,謝謝大家。